package com.example.jedis.client.protocol.request;

import com.example.jedis.client.protocol.constant.RedisProtocolConstant;
import com.example.jedis.client.transport.RedisTransport;
import redis.clients.jedis.exceptions.JedisException;

import java.io.ByteArrayOutputStream;
import java.nio.ByteBuffer;

/**
 请求协议：
 *<参数数量> CR LF
 $<参数 1 的字节数量> CR LF
 <参数 1 的数据> CR LF
 ...
 $<参数 N 的字节数量> CR LF
 <参数 N 的数据> CR LF

 示例：
 命令： set mykey myvalue
 报文：*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\n\r\nmyvalue\r\n

 */
public class RequestProtocolImpl implements RequestProtocol {
    RedisTransport redisTransport = null;

    public RedisTransport getRedisTransport() {
        return redisTransport;
    }

    public void setRedisTransport(RedisTransport redisTransport) {
        this.redisTransport = redisTransport;
    }

    private byte [] getIntegerStringBytes(int value){
        return Integer.toString(value).getBytes();
    }

    @Override
    public void  write(byte[]... args)  {
        try {
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            byteArrayOutputStream.write(RedisProtocolConstant.REQUEST_ASTERISK_BYTE);// *
            byteArrayOutputStream.write(getIntegerStringBytes(args.length)); //参数个数
            byteArrayOutputStream.write(RedisProtocolConstant.CR_BYPE);// CR
            byteArrayOutputStream.write(RedisProtocolConstant.LF_BYTE);//LF
            for (int i = 0; i < args.length; i++) {
                byteArrayOutputStream.write(RedisProtocolConstant.REQUEST_DOLLAR_BYTE);// $
                byteArrayOutputStream.write(getIntegerStringBytes(args[i].length));//<参数 i 的字节数量>
                byteArrayOutputStream.write(RedisProtocolConstant.CR_BYPE);// CR
                byteArrayOutputStream.write(RedisProtocolConstant.LF_BYTE);// LF
                byteArrayOutputStream.write(args[i]);  //<参数 i 的内容>
                byteArrayOutputStream.write(RedisProtocolConstant.CR_BYPE);// CR
                byteArrayOutputStream.write(RedisProtocolConstant.LF_BYTE);// LF
            }
            byte [] data = byteArrayOutputStream.toByteArray();

            ByteBuffer byteBuffer =  ByteBuffer.wrap(data);
            redisTransport.write(byteBuffer);
        }catch (Exception e){
            throw new JedisException(e);
        }

    }
}
